package commons.io.in;

import commons.io.in.File_in.TypeCouche;
import commons.params_appli.ParamsAppli;
import commons.errors.ErrorsHandler;
import commons.logs.Logger;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;

/**
 * Va contenir toutes les couches d'entrées (à partir d'un répertoire)
 */
public class Data_in {

	public String path_RepFichierSource;
	public ArrayList<File_in> vFileIn;

	public Data_in () {
		vFileIn = new ArrayList<File_in>();
	}

	public void clear() {
		for (File_in couche : vFileIn)
			couche.clear();
		vFileIn.clear();
	}

	public boolean containsThisCouche_typePT(String coucheName) {
		File_in couche = getCouche(coucheName);
		return (couche != null && couche.getTypeCouche()==TypeCouche.PT);
	}
	public boolean containsThisCouche_typeLIN(String coucheName) {
		File_in couche = getCouche(coucheName);
		return (couche != null && couche.getTypeCouche()==TypeCouche.LIN);
	}

	public ArrayList<String> getAllCoucheNames_typeLIN() {
		ArrayList<String> vRes = new ArrayList<String>();
		for (File_in couche : vFileIn) {
			if (couche.getTypeCouche()==TypeCouche.LIN)
				vRes.add (couche.nomCouche);
		}
		return vRes;
	}
	public ArrayList<String> getAllCoucheNames_typePT() {
		ArrayList<String> vRes = new ArrayList<String>();
		for (File_in couche : vFileIn) {
			if (couche.getTypeCouche()==TypeCouche.PT)
				vRes.add (couche.nomCouche);
		}
		return vRes;
	}

	public File_in getCouche(String coucheName) {
		for (File_in couche : vFileIn) {
			if (couche.getNomCouche().toLowerCase().equals(coucheName.toLowerCase()))
				return couche;
		}
		return null;
	}

	public ArrayList<String> getChampsOfCouche (String coucheName) {
		File_in couche = getCouche(coucheName);
		if (couche==null)
			return new ArrayList<String>();

		return couche.model_in.getVFieldName();
	}

	// Lecture des différentes couches dans le 'pathRepTravail' fourni
	// ne lit que les modeles des couches, et pas les données à ce stade
	public static Data_in readFromDirectory_dontLoadData(String path_RepFichierSource) {
		Data_in data_in = new Data_in();

		data_in.path_RepFichierSource = path_RepFichierSource;

		File rep = new File(path_RepFichierSource);
		if (!rep.exists()) {
			ErrorsHandler.addError("Le répertoire contenant les données est introuvable : " + path_RepFichierSource);
			return null;
		}

		if (!rep.isDirectory()) {
			ErrorsHandler.addError("Le répertoire contenant les données n'est pas un répertoire : " + path_RepFichierSource);
			return null;
		}

		// Liste des fichiers d'échanges
		final String ext = "." + ParamsAppli.getParam("common.EXTENSION_FICHIER_ECHANGE");
		FilenameFilter filter = new FilenameFilter() {public boolean accept(File dir, String name) {return name.endsWith(ext);}};

		String[] listCouches = rep.list(filter);
		if (listCouches == null || listCouches.length==0) {
			ErrorsHandler.addError("Il n'y a aucune couche dans le répertoire : " + path_RepFichierSource);
			return null;
		}

		// Parcours des fichiers d'échange
		for (String nomCouche : listCouches) {
			data_in.vFileIn.add (File_in.createFromFile_dontLoadData(path_RepFichierSource, nomCouche));
			if (ErrorsHandler.isThereErrors()) return null;
		}

		return data_in;
	}

	
	public void printStatsGlobales() {
		Logger.log_INFO1("---------------------------------------------");
		Logger.log_INFO1("-- Résumé des données d'entrée --");
		Logger.log_INFO1("Nb fichiers en entrée : " + vFileIn.size());
		for (File_in file_in: vFileIn) file_in.printStatsGlobales();
		Logger.log_INFO1("---------------------------------------------");
	}


}
